package com.scott.itcast.lock;

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 *  用Lock处理并发
 *  用synchronized和ReentrantLock来互斥的问题
 */
public class LockTest {
	
	public static void main(String[] args) {
		new LockTest().init();
	}
	
	
	private void init(){
		final Outputer outputer = new Outputer();
		
		//第1个线程
		new Thread(new Runnable(){
			public void run() {
				while(true){
					try {
						Thread.sleep(500);
						outputer.output("801234567898");
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
			}
			
		}).start();
		
		
		//第2个线程
		new Thread(new Runnable(){
			public void run() {
				while(true){
					try {
						Thread.sleep(500);
						outputer.output("masdfghjklqwertyuiopm");
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
			}
			
		}).start();
	}//end init
	
	static class Outputer{
		
		//锁的作用： 互斥。 锁本身也是一个对象  可以保证我这个线程执行完了。其他的线程才可以执行
		Lock lock = new ReentrantLock();
		
		//锁机制
		public void output(String name){
			int len = name.length();
			
			//开始上锁  如果抛了异常，那么别人就再也进不去了。 就相当于你晕倒在洗手间了。那别人就再也进不去了。
			lock.lock();
			try{
				
				//不管你晕倒没晕倒  执行完毕后就会释放锁。 正常或者非正常的退出都应该把锁释放。
				for(int i=0;i<len;i++){
					System.out.print(name.charAt(i));
				}
				//换行
				System.out.println();
			}finally{
				//执行完代码后释放锁
				lock.unlock();
			}
		}//end output
	}//end Outputer
}//end LockTest



